package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.model.album.BaseAttribute;
import com.atguigu.tingshu.model.album.BaseCategory1;
import com.atguigu.tingshu.model.album.BaseCategoryView;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@SuppressWarnings({"all"})
public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1> implements BaseCategoryService {

    @Autowired
    private BaseCategory1Mapper baseCategory1Mapper;

    @Autowired
    private BaseCategory2Mapper baseCategory2Mapper;

    @Autowired
    private BaseCategory3Mapper baseCategory3Mapper;

    @Autowired
    private BaseCategoryViewMapper baseCategoryViewMapper;

    @Autowired
    private BaseAttributeMapper baseAttributeMapper;



    /**
     * 查询所有1,2,3级分类数据
     *
     * @return
     */
    @Override
    public List<JSONObject> getBaseCategoryList() {
        //1.查询分类视图中所有分类数据 共计：401条记录
        List<BaseCategoryView> allCategoryList = baseCategoryViewMapper.selectList(null);
        //2.创建封装1级分类的JSON对象集合
        List<JSONObject> category1List = new ArrayList<>();

        //3.处理1aA级分类数据
        //3.1 对所有分类按照1级分类ID分组 得到Map<1级分类ID, "一级分类"列表>
        Map<Long, List<BaseCategoryView>> map1 = allCategoryList
                .stream()
                .collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
        //3.2 遍历Map<1级分类ID, "一级分类"列表> 封装一个"一级分类JSON对象"
        for (Map.Entry<Long, List<BaseCategoryView>> entry1 : map1.entrySet()) {
            //3.2.1 创建"一级分类JSON对象"
            JSONObject jsonObject1 = new JSONObject();
            //3.2.2 封装1级分类ID
            jsonObject1.put("categoryId", entry1.getKey());
            //3.2.3 封装1级分类名称
            jsonObject1.put("categoryName", entry1.getValue().get(0).getCategory1Name());

            //4.处理2级分类数据
            //4.1 获取分组后"1级"分类列表，按照2级分类ID进行分组，得到二级分类Map<2级分类ID，"2级分类"列表>
            Map<Long, List<BaseCategoryView>> map2 = entry1.getValue()
                    .stream()
                    .collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            //4.2 声明保存2级分类JSON对象集合
            List<JSONObject> jsonObject2List = new ArrayList<>();
            //4.3 遍历二级分类Map<2级分类ID，"2级分类"列表> 封装2级分类JSON对象
            for (Map.Entry<Long, List<BaseCategoryView>> entry2 : map2.entrySet()) {
                JSONObject jsonObject2 = new JSONObject();
                jsonObject2.put("categoryId", entry2.getKey());
                jsonObject2.put("categoryName", entry2.getValue().get(0).getCategory2Name());
                jsonObject2List.add(jsonObject2);
                //5.处理3级分类数据
                //5.1 声明保存3级分类JSON对象集合
                List<JSONObject> jsonObject3List = new ArrayList<>();
                for (BaseCategoryView baseCategoryView : entry2.getValue()) {
                    //5.2 遍历分组后"2级"分类列表，构建3级分类JSON对象
                    JSONObject jsonObject3 = new JSONObject();
                    jsonObject3.put("categoryId", baseCategoryView.getCategory3Id());
                    jsonObject3.put("categoryName", baseCategoryView.getCategory3Name());
                    jsonObject3List.add(jsonObject3);
                }
                //5.3 将当前2级分类下包含3级分类集合放入到"二级分类JSON对象""categoryChild"属性中
                jsonObject2.put("categoryChild", jsonObject3List);
            }
            //4.3 将当前1及分类下包含2级分类集合放入到"一级分类JSON对象""categoryChild"属性中
            jsonObject1.put("categoryChild", jsonObject2List);

            //3.2.4 将1级分类JSON对象加入到最终结果集合中
            category1List.add(jsonObject1);
        }
        return category1List;
    }

    /**
     * 根据一级分类Id获取分类标签以及标签值
     * @param category1Id
     * @return
     */
    @Override
    public List<BaseAttribute> findAttributeByCategory1Id(Long category1Id) {
        return baseAttributeMapper.findAttributeByCategory1Id(category1Id);
    }
}
